package Leetcode;

/**
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 * 如果反转后整数超过 32 位的有符号整数的范围[−231, 231− 1] ，就返回 0。
 * 假设环境不允许存储 64 位整数（有符号或无符号）。
 */
public class 力扣7_整数反转 {

    /**
     * 算法就是这样 如何防止溢出
     */
    public static int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            rev = rev * 10 + pop;
        }
        return rev;
    }

    /**
     * INT.MAX = 2147483647
     * rev * 10 + pop 溢出
     * 如果rev == INT.MAX/10 那么上面的表达式变为2147483640 + pop 此时 pop > 7就会溢出
     * 如果rev > INT.MAX/10 那么乘10之后 不用加pop就溢出了
     */
    public static int reverse1(int x) {
        int intMax = Integer.MAX_VALUE / 10;
        int intMin = Integer.MIN_VALUE / 10;
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;

            if (rev > intMax || (rev == intMax && pop > 7)) return 0;
            if (rev < intMin || (rev == intMin && pop < -8)) return 0;

            rev = rev * 10 + pop;
        }
        return rev;
    }

    public static void main(String[] args) {
        System.out.println(reverse(-12345));
        System.out.println(Integer.MAX_VALUE);
    }
}
